package com.ruoyi.ring.config;

import java.security.SecureRandom;
import java.util.List;
import java.util.Random;

/**
 * 8位唯一群组码生成工具类
 * 确保生成的群组码在系统中不会重复
 */
public class GroupCodeGenerator {

    // 字符池：包含数字、大写字母和小写字母，排除易混淆的字符
    private static final String CHARACTER_POOL = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    private static final int CODE_LENGTH = 6;
    private static final Random RANDOM = new SecureRandom();

    /**
     * 生成一个唯一的8位群组码
     * @return 8位唯一群组码
     * @throws IllegalStateException 当所有可能的组合都已使用时抛出
     */
    public static String generateUniqueGroupCode(List<String> usedCodes) {
        // 计算最大可能的组合数
        long maxPossibleCodes = (long) Math.pow(CHARACTER_POOL.length(), CODE_LENGTH);
        System.out.println(maxPossibleCodes);
        // 检查是否还有可用的组合
        if (usedCodes.size() >= maxPossibleCodes) {
            throw new IllegalStateException("已用尽所有可能的群组码组合");
        }
        String code;
        // 循环生成直到获得一个未使用的群组码
        do {
            code = generateGroupCode();
        } while (exists(usedCodes,code));
        return code;
    }

    /**
     * 生成单个8位群组码（不检查唯一性）
     */
    private static String generateGroupCode() {
        StringBuilder codeBuilder = new StringBuilder(CODE_LENGTH);

        for (int i = 0; i < CODE_LENGTH; i++) {
            int index = RANDOM.nextInt(CHARACTER_POOL.length());
            codeBuilder.append(CHARACTER_POOL.charAt(index));
        }
        return codeBuilder.toString();
    }

    /**
     * 检查群组码是否已存在
     */
    public static boolean exists(List<String> usedCodes,String code) {
        return usedCodes.contains(code);
    }
}

